package com;

import com.controller.ChatWebSocket;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import java.util.Set;

/**
 * WebSocket测试基类
 * 提供通用的测试功能和清理方法
 */
@SpringBootTest
@ActiveProfiles("test")
public abstract class BaseWebSocketTest {

    @BeforeEach
    void setUp() {
        // 测试前的准备工作
        // 注意：由于ChatWebSocket使用静态变量，无法直接清理
        // 在实际测试中，可能需要重启应用或使用其他方式清理状态
        System.out.println("开始WebSocket测试...");
    }

    @AfterEach
    void tearDown() {
        // 测试后的清理工作
        System.out.println("WebSocket测试完成");
    }

    /**
     * 获取当前在线用户数
     */
    protected int getOnlineUserCount() {
        return ChatWebSocket.getOnlineUserCount();
    }

    /**
     * 获取当前在线用户列表
     */
    protected Set<String> getOnlineUsers() {
        return ChatWebSocket.getOnlineUsers();
    }

    /**
     * 发送消息给指定用户
     */
    protected boolean sendMessageToUser(String userId, String message) {
        return ChatWebSocket.sendMessageToUser(userId, message);
    }

    /**
     * 等待指定时间
     */
    protected void waitFor(int milliseconds) {
        try {
            Thread.sleep(milliseconds);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

    /**
     * 打印当前WebSocket状态
     */
    protected void printWebSocketStatus() {
        System.out.println("当前在线用户数: " + getOnlineUserCount());
        System.out.println("当前在线用户: " + getOnlineUsers());
    }

    /**
     * 验证用户是否在线
     */
    protected boolean isUserOnline(String userId) {
        return getOnlineUsers().contains(userId);
    }

    /**
     * 等待用户上线
     */
    protected boolean waitForUserOnline(String userId, int timeoutSeconds) {
        long startTime = System.currentTimeMillis();
        long timeout = timeoutSeconds * 1000L;
        
        while (System.currentTimeMillis() - startTime < timeout) {
            if (isUserOnline(userId)) {
                return true;
            }
            waitFor(100); // 等待100毫秒
        }
        return false;
    }

    /**
     * 等待用户下线
     */
    protected boolean waitForUserOffline(String userId, int timeoutSeconds) {
        long startTime = System.currentTimeMillis();
        long timeout = timeoutSeconds * 1000L;
        
        while (System.currentTimeMillis() - startTime < timeout) {
            if (!isUserOnline(userId)) {
                return true;
            }
            waitFor(100); // 等待100毫秒
        }
        return false;
    }

    /**
     * 等待在线用户数达到指定值
     */
    protected boolean waitForOnlineUserCount(int expectedCount, int timeoutSeconds) {
        long startTime = System.currentTimeMillis();
        long timeout = timeoutSeconds * 1000L;
        
        while (System.currentTimeMillis() - startTime < timeout) {
            if (getOnlineUserCount() == expectedCount) {
                return true;
            }
            waitFor(100); // 等待100毫秒
        }
        return false;
    }
}
